iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 7
0
自我挑戰組

白鬍子老頭30天 Swift Ios系列 第 30

Day(7+23) CoreLocation

  • 分享至 

  • xImage
  •  

CoreLocation

沒有UI

CLLocation

coordinate //座標

var coordinate: CLLocationCoordinate2D { get }

struct CLLocationCoordinate2D {
CLLocationDegree latitude
CLLocationDegree longitude
}

altitude //海拔

var altitude: CLLocationDistance { get }

horizontal/verticalAccuracy //定位精準度
http://ithelp.ithome.com.tw/upload/images/20170114/20103833NC56I50Q78.png
透過gps , wify ,cellular
越精準越耗電~

timestamp //確定此位置的時機

var timestamp: Date { get }

speed //設備的移動速度

var speed: CLLocationSpeed { get }

course //設備行進的方向

var course: CLLocationDirection { get }

從哪取得CLLocation

透過CLLocationManager
1.檢查裝置可否使用
2.實例化CLLocationManager設定delegate來接收update
3.配置manager根據你想要什麼location update
4.開始監聽location的改變

監聽的種類

Accuracy - based continual update
Update when significant changes in location occur
Region - based update
Heading monitoring

詢問你的設備可以做什麼

回傳應用的使用位置服務的授權狀態
要在 info.plist 設定詢問權限時的entry
NSLocationWhenInUseUsageDescription 或 NSLocationAlwaysUsageDescription
定位的目的前者使用者使用期間後者Always

class func authorizationStatus() -> CLAuthorizationStatus

如果authorizationStatus是kCLAuthorizationStatusNotDetermined
則可以呼叫

func requestWhenInUseAuthorization()
func requestAlwaysAuthorization()

從使用者請求適當類型的授權。

回傳有沒有開啟GPS服務

class func locationServicesEnabled() -> Bool

判斷設備是否支持更新位置信息

class func significantLocationChangeMonitoringAvailable() -> Bool

判斷設備是否支持區域檢測

class func isMonitoringAvailable(for regionClass: AnyClass) -> Bool

Accury-based continuous location moritoring

desireAccuracy
決定要多精準

locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

distanceFilter
多少距離才會委託更新

locationManager.distanceFilter = 1000.0f;

然後呼叫StartUpdatingLocation()

func startUpdatingLocation()

透過Delegate獲取通知

optional func locationManager(_ manager: CLLocationManager, 
           didUpdateLocations locations: [CLLocation])

MapKit

MKMapView 展示出地圖

地圖上可以有Annotations在上面
每個Annotation 是個coordinate ,tittle , subtittle

Create

improt MapKit
let mpV=MKMapView()

或是直接從storyboard上拉

MKAnnotation

annotations : [MKAnnotation] {get}

http://ithelp.ithome.com.tw/upload/images/20170114/20103833ryEinXXNIb.png
MKAnnotation 是個 protocol
由於annotations是readOnly必須透過這些方法

func addAnnotation(MKAnnotation)
func addAnnotations([MKAnnotation])
func removeAnnotation(MKAnnotation)
func removeAnnotations([MKAnnotation])

System會像tableView一樣reuse pin
pin可以被reuse

defalt預設是 MKPinAnnotationView
http://ithelp.ithome.com.tw/upload/images/20170114/20103833SGBdUnmufS.png
你可以subclass或設定屬性去調整他的樣子
點選他的會得到一個callout(view就跳出來)
http://ithelp.ithome.com.tw/upload/images/20170114/20103833h29qXUHPde.png
這個callout只有在canShowCallOut是true時會出現

跟UITableViewCell很像
插入MKMapviewDeegate method

optional func mapView(_ mapView: MKMapView, 
              viewFor annotation: MKAnnotation) -> MKAnnotationView?
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) ->MKAnnotationView? {
        var  view = mapView.dequeueReusableAnnotationView(withIdentifier: "")
        if view == nil {
            view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "")
            view?.canShowCallout = true
        }
        view?.annotation = annotation
        return view
}

上一篇
Day(7+22) Core Motion
系列文
白鬍子老頭30天 Swift Ios30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言